//===- SymbolOptions.cpp --------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <mcld/SymbolOptions.h>
#include <mcld/LinkerConfig.h>

namespace {

// Not supprted yet {
llvm::cl::list<std::string> ArgForceUndefined(
    "u",
    llvm::cl::ZeroOrMore,
    llvm::cl::desc("Force symbol to be undefined in the output file"),
    llvm::cl::value_desc("symbol"));

llvm::cl::alias ArgForceUndefinedAlias("undefined",
                                       llvm::cl::ZeroOrMore,
                                       llvm::cl::desc("alias for -u"),
                                       llvm::cl::aliasopt(ArgForceUndefined));

llvm::cl::opt<std::string> ArgVersionScript(
    "version-script",
    llvm::cl::desc("Version script."),
    llvm::cl::value_desc("Version script"));

llvm::cl::opt<bool> ArgWarnCommon("warn-common",
                                  llvm::cl::desc("warn common symbol"),
                                  llvm::cl::init(false));

llvm::cl::opt<bool> ArgDefineCommon("d",
                                    llvm::cl::ZeroOrMore,
                                    llvm::cl::desc("Define common symbol"),
                                    llvm::cl::init(false));

llvm::cl::alias ArgDefineCommonAlias1("dc",
                                      llvm::cl::ZeroOrMore,
                                      llvm::cl::desc("alias for -d"),
                                      llvm::cl::aliasopt(ArgDefineCommon));

llvm::cl::alias ArgDefineCommonAlias2("dp",
                                      llvm::cl::ZeroOrMore,
                                      llvm::cl::desc("alias for -d"),
                                      llvm::cl::aliasopt(ArgDefineCommon));

// } Not supported yet

}  // anonymous namespace

using namespace mcld;

//===----------------------------------------------------------------------===//
// SymbolOptions
//===----------------------------------------------------------------------===//
SymbolOptions::SymbolOptions()
    : m_ForceUndefined(ArgForceUndefined),
      m_VersionScript(ArgVersionScript),
      m_WarnCommon(ArgWarnCommon),
      m_DefineCommon(ArgDefineCommon) {
}

bool SymbolOptions::parse(LinkerConfig& pConfig) {
  // set -d
  pConfig.options().setDefineCommon(m_DefineCommon);

  // set -u/--undefined symbols
  llvm::cl::list<std::string>::iterator usym, usymEnd = m_ForceUndefined.end();
  for (usym = m_ForceUndefined.begin(); usym != usymEnd; ++usym)
    pConfig.options().getUndefSymList().push_back(*usym);

  return true;
}
